package presentacion.ejecutable;

import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;

import java.awt.Font;

import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.ImageIcon;

import presentacion.sensores.*;
import javax.swing.JProgressBar;
import javax.swing.JTextPane;

import modelo.Vaca;
import modelo.alimentacion.Concentrado;
import modelo.alimentacion.PlanDeAlimentacion;
import modelo.resultados.Diagnostico;

import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.border.EtchedBorder;
import javax.swing.JScrollBar;
import java.awt.BorderLayout;
import javax.swing.SwingConstants;

public class MJX {

	private  JFrame frmSistemaDeControl;
	private JTextField lactometroTextField;
	private JTextField RedTextField;
	private JTextField GreenTextField;
	private JTextField BlueTextField;
	private JTextField potenciometroTextField;
	private JTextField GrasaTextField;
	private JTextField produccionTextField;
	private JTextField estadoDensidadTextField;
	private JTextField estadoPhTextField;
	private JTextField estadoColorTextField;
	private JTextField estadoGrasaTextField;
	private JTextField estadoGeneralTextField;
	private JTextPane observacionesCalidadTextField;
	private JTextField idTextField;
	private JTextField pesoTextField;
	private JTextField edadTextField;
	private JTextField mesesLactanciaTextField;
	private JTextPane resumenTextPane;
	
	
	private final Lactometro lactometro;
	private final Potenciometro potenciometro;
	private final SensorCMOS sensorCMOS;
	private final Grasometro grasometro;
	private final CantidadLeche cantleche;
	
	private final List<Vaca> vacas;
	
	private int vacaActual;
	
	public static MJX instance;
	private JTextField lecheTotalGeneralTextField;
	private JTextField VacasTextField;
	private JTextField AlimentoTextField;
	
	private int lecheTotalGeneral;
	

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MJX window = new MJX();
					window.frmSistemaDeControl.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public MJX() {
		this.lecheTotalGeneral = 0;
		this.cantleche = new CantidadLeche();
		this.lactometro = new Lactometro();
		this.potenciometro = new Potenciometro();
		this.sensorCMOS = new SensorCMOS();
		this.grasometro = new Grasometro();
		this.vacas = new ArrayList<Vaca>();
		this.vacas.add(new Vaca("000001", 500, 2, 10));
		this.vacas.add(new Vaca("000002", 600, 7, 20));
		this.vacas.add(new Vaca("000003", 540, 12, 15));
		this.vacas.add(new Vaca("000004", 520, 23, 24));
		this.vacas.add(new Vaca("000005", 570, 4, 12));
		this.vacaActual = 0;
		initialize();
		
		this.instance = this;
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frmSistemaDeControl = new JFrame();
		frmSistemaDeControl.setIconImage(Toolkit.getDefaultToolkit().getImage(MJX.class.getResource("/resources/vacaicon.png")));
		frmSistemaDeControl.setTitle("MilkPro");
		frmSistemaDeControl.setBounds(100, 100, 800, 600);
		frmSistemaDeControl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmSistemaDeControl.getContentPane().setLayout(null);
		
		JLabel tituloLbl = new JLabel("Sistema de Control de Alimentación Bovina");
		tituloLbl.setIcon(null);
		tituloLbl.setFont(new Font("Dialog", Font.PLAIN, 34));
		tituloLbl.setBounds(12, 27, 752, 89);
		frmSistemaDeControl.getContentPane().add(tituloLbl);
		
		JTabbedPane panelPrincipal = new JTabbedPane(JTabbedPane.TOP);
		panelPrincipal.setBounds(304, 128, 482, 434);
		frmSistemaDeControl.getContentPane().add(panelPrincipal);
		
		JPanel sensoresTab = new JPanel();
		panelPrincipal.addTab("Sensores", null, sensoresTab, null);
		sensoresTab.setLayout(null);
		
		JLabel lactometroLbl = new JLabel("Lactómetro");
		lactometroLbl.setBounds(24, 55, 97, 15);
		sensoresTab.add(lactometroLbl);
		
		lactometroTextField = new JTextField();
		lactometroTextField.setEditable(false);
		lactometroTextField.setBounds(146, 51, 97, 19);
		sensoresTab.add(lactometroTextField);
		lactometroTextField.setColumns(10);
		
		JLabel unidadLactometroLbl = new JLabel("g/L");
		unidadLactometroLbl.setBounds(252, 53, 34, 15);
		sensoresTab.add(unidadLactometroLbl);
		
		JLabel lblSensorCmos = new JLabel("SensorCMOS");
		lblSensorCmos.setBounds(24, 97, 97, 15);
		sensoresTab.add(lblSensorCmos);
		
		RedTextField = new JTextField();
		RedTextField.setEditable(false);
		RedTextField.setColumns(10);
		RedTextField.setBounds(167, 95, 48, 19);
		sensoresTab.add(RedTextField);
		
		JLabel lblR = new JLabel("R");
		lblR.setBounds(146, 97, 15, 15);
		sensoresTab.add(lblR);
		
		GreenTextField = new JTextField();
		GreenTextField.setEditable(false);
		GreenTextField.setColumns(10);
		GreenTextField.setBounds(248, 97, 48, 19);
		sensoresTab.add(GreenTextField);
		
		JLabel lblG = new JLabel("G");
		lblG.setBounds(227, 99, 15, 15);
		sensoresTab.add(lblG);
		
		BlueTextField = new JTextField();
		BlueTextField.setEditable(false);
		BlueTextField.setColumns(10);
		BlueTextField.setBounds(330, 97, 48, 19);
		sensoresTab.add(BlueTextField);
		
		JLabel lblB = new JLabel("B");
		lblB.setBounds(309, 99, 15, 15);
		sensoresTab.add(lblB);
		
		JLabel potenciometroLbl = new JLabel("pH-Metro");
		potenciometroLbl.setBounds(24, 143, 97, 15);
		sensoresTab.add(potenciometroLbl);
		
		potenciometroTextField = new JTextField();
		potenciometroTextField.setEditable(false);
		potenciometroTextField.setColumns(10);
		potenciometroTextField.setBounds(146, 141, 97, 19);
		sensoresTab.add(potenciometroTextField);
		
		JLabel grasometroLbl = new JLabel("Grasa");
		grasometroLbl.setBounds(24, 191, 97, 15);
		sensoresTab.add(grasometroLbl);
		
		GrasaTextField = new JTextField();
		GrasaTextField.setEditable(false);
		GrasaTextField.setColumns(10);
		GrasaTextField.setBounds(146, 187, 97, 19);
		sensoresTab.add(GrasaTextField);
		
		JLabel percentLbl = new JLabel("%");
		percentLbl.setBounds(252, 189, 34, 15);
		sensoresTab.add(percentLbl);
		
		JLabel produccionLbl = new JLabel("Producción");
		produccionLbl.setBounds(24, 236, 97, 15);
		sensoresTab.add(produccionLbl);
		
		produccionTextField = new JTextField();
		produccionTextField.setEditable(false);
		produccionTextField.setColumns(10);
		produccionTextField.setBounds(146, 232, 97, 19);
		sensoresTab.add(produccionTextField);
		
		JLabel LitroLbl = new JLabel("L");
		LitroLbl.setBounds(252, 234, 34, 15);
		sensoresTab.add(LitroLbl);
		
		JPanel diagnosticoTab = new JPanel();
		panelPrincipal.addTab("Diagnóstico", null, diagnosticoTab, null);
		diagnosticoTab.setLayout(null);
		
		JLabel lblCalidadDeLa = new JLabel("Calidad de la leche");
		lblCalidadDeLa.setFont(new Font("Dialog", Font.BOLD, 15));
		lblCalidadDeLa.setBounds(31, 24, 187, 15);
		diagnosticoTab.add(lblCalidadDeLa);
		
		JLabel lblDensidad = new JLabel("Densidad");
		lblDensidad.setBounds(31, 58, 87, 15);
		diagnosticoTab.add(lblDensidad);
		
		estadoDensidadTextField = new JTextField();
		estadoDensidadTextField.setEditable(false);
		estadoDensidadTextField.setBounds(261, 56, 114, 19);
		diagnosticoTab.add(estadoDensidadTextField);
		estadoDensidadTextField.setColumns(10);
		
		JLabel lblPh = new JLabel("pH");
		lblPh.setBounds(31, 87, 87, 15);
		diagnosticoTab.add(lblPh);
		
		estadoPhTextField = new JTextField();
		estadoPhTextField.setEditable(false);
		estadoPhTextField.setColumns(10);
		estadoPhTextField.setBounds(261, 85, 114, 19);
		diagnosticoTab.add(estadoPhTextField);
		
		JLabel lblColor = new JLabel("Color");
		lblColor.setBounds(31, 116, 87, 15);
		diagnosticoTab.add(lblColor);
		
		estadoColorTextField = new JTextField();
		estadoColorTextField.setEditable(false);
		estadoColorTextField.setColumns(10);
		estadoColorTextField.setBounds(261, 114, 114, 19);
		diagnosticoTab.add(estadoColorTextField);
		
		JLabel lblGrasa = new JLabel("Grasa");
		lblGrasa.setBounds(31, 145, 87, 15);
		diagnosticoTab.add(lblGrasa);
		
		estadoGrasaTextField = new JTextField();
		estadoGrasaTextField.setEditable(false);
		estadoGrasaTextField.setColumns(10);
		estadoGrasaTextField.setBounds(261, 143, 114, 19);
		diagnosticoTab.add(estadoGrasaTextField);
		
		observacionesCalidadTextField = new JTextPane();
		observacionesCalidadTextField.setBounds(31, 252, 344, 131);
		diagnosticoTab.add(observacionesCalidadTextField);
		
		JLabel lblEstadoGeneral = new JLabel("Estado general:");
		lblEstadoGeneral.setBounds(31, 225, 114, 15);
		diagnosticoTab.add(lblEstadoGeneral);
		
		estadoGeneralTextField = new JTextField();
		estadoGeneralTextField.setEditable(false);
		estadoGeneralTextField.setColumns(10);
		estadoGeneralTextField.setBounds(154, 223, 114, 19);
		diagnosticoTab.add(estadoGeneralTextField);
		
		JPanel plandealimentacionTab = new JPanel();
		panelPrincipal.addTab("Plan de Alimentación", null, plandealimentacionTab, null);
		plandealimentacionTab.setLayout(null);
		

		resumenTextPane = new JTextPane();
		resumenTextPane.setBounds(12, 45, 453, 350);
		plandealimentacionTab.add(resumenTextPane);
		resumenTextPane.setEditable(false);
		
		JScrollPane scrollBar = new JScrollPane(resumenTextPane);
		scrollBar.setBounds(10, 45, 455, 350);
		plandealimentacionTab.add(scrollBar);
		
		JLabel lblResumen = new JLabel("Resumen");
		lblResumen.setBounds(12, 12, 70, 15);
		plandealimentacionTab.add(lblResumen);
		
		JPanel estadisticasTab = new JPanel();
		panelPrincipal.addTab("Estadísticas", null, estadisticasTab, null);
		estadisticasTab.setLayout(null);
		
		JLabel lblEstadisticasVacaActual = new JLabel("Estadisticas vaca actual");
		lblEstadisticasVacaActual.setBounds(12, 12, 189, 15);
		estadisticasTab.add(lblEstadisticasVacaActual);
		
		JLabel lecheTotalLbl = new JLabel("Leche total producida");
		lecheTotalLbl.setBounds(22, 39, 161, 15);
		estadisticasTab.add(lecheTotalLbl);
		
		final JProgressBar lecheTotalPBar = new JProgressBar();
		lecheTotalPBar.setStringPainted(true);
		lecheTotalPBar.setBounds(276, 39, 148, 14);
		estadisticasTab.add(lecheTotalPBar);
		
		JLabel lactanciasLbl = new JLabel("Leche en buen estado");
		lactanciasLbl.setBounds(22, 66, 202, 15);
		estadisticasTab.add(lactanciasLbl);
		
		JLabel label_1 = new JLabel("Estadisticas vaca actual");
		label_1.setBounds(12, 206, 189, 15);
		estadisticasTab.add(label_1);
		
		final JProgressBar lecheBuenEstadoPB = new JProgressBar();
		lecheBuenEstadoPB.setStringPainted(true);
		lecheBuenEstadoPB.setBounds(276, 67, 148, 14);
		estadisticasTab.add(lecheBuenEstadoPB);
		
		JLabel lblGrasas = new JLabel("Grasas");
		lblGrasas.setBounds(22, 93, 202, 15);
		estadisticasTab.add(lblGrasas);
		
		final JProgressBar grasasPB = new JProgressBar();
		grasasPB.setStringPainted(true);
		grasasPB.setBounds(276, 94, 148, 14);
		estadisticasTab.add(grasasPB);
		
		JLabel label_2 = new JLabel("Leche total producida");
		label_2.setBounds(22, 232, 161, 15);
		estadisticasTab.add(label_2);
		
		lecheTotalGeneralTextField = new JTextField();
		lecheTotalGeneralTextField.setEditable(false);
		lecheTotalGeneralTextField.setBounds(276, 230, 148, 19);
		estadisticasTab.add(lecheTotalGeneralTextField);
		lecheTotalGeneralTextField.setColumns(10);
		
		JLabel lblVacas = new JLabel("Vacas");
		lblVacas.setBounds(22, 259, 202, 15);
		estadisticasTab.add(lblVacas);
		
		VacasTextField = new JTextField();
		VacasTextField.setEditable(false);
		VacasTextField.setColumns(10);
		VacasTextField.setBounds(276, 257, 148, 19);
		estadisticasTab.add(VacasTextField);
		
		JLabel lblAlimento = new JLabel("Alimento");
		lblAlimento.setBounds(22, 120, 202, 15);
		estadisticasTab.add(lblAlimento);
		
		AlimentoTextField = new JTextField();
		AlimentoTextField.setEditable(false);
		AlimentoTextField.setColumns(10);
		AlimentoTextField.setBounds(276, 118, 148, 19);
		estadisticasTab.add(AlimentoTextField);
		
		JLabel versionLbl = new JLabel("MilkPro v0.0b");
		versionLbl.setBounds(12, 12, 170, 15);
		frmSistemaDeControl.getContentPane().add(versionLbl);
		
		JTabbedPane vacaPanel = new JTabbedPane(JTabbedPane.TOP);
		vacaPanel.setBounds(12, 301, 280, 261);
		frmSistemaDeControl.getContentPane().add(vacaPanel);
		
		JPanel panel = new JPanel();
		vacaPanel.addTab("Vaca", null, panel, null);
		panel.setLayout(null);
		
		JLabel lblId = new JLabel("ID");
		lblId.setBounds(12, 29, 70, 15);
		panel.add(lblId);
		
		idTextField = new JTextField();
		idTextField.setEditable(false);
		idTextField.setBounds(100, 27, 114, 19);
		panel.add(idTextField);
		idTextField.setColumns(10);
		
		JLabel lblPeso = new JLabel("Peso");
		lblPeso.setBounds(12, 58, 70, 15);
		panel.add(lblPeso);
		
		pesoTextField = new JTextField();
		pesoTextField.setEditable(false);
		pesoTextField.setColumns(10);
		pesoTextField.setBounds(100, 56, 114, 19);
		panel.add(pesoTextField);
		
		JLabel lblKg = new JLabel("Kg");
		lblKg.setBounds(223, 58, 52, 15);
		panel.add(lblKg);
		
		edadTextField = new JTextField();
		edadTextField.setEditable(false);
		edadTextField.setColumns(10);
		edadTextField.setBounds(100, 85, 114, 19);
		panel.add(edadTextField);
		
		JLabel lblEdad = new JLabel("Edad");
		lblEdad.setBounds(12, 87, 70, 15);
		panel.add(lblEdad);
		
		JLabel lblMeses = new JLabel("meses");
		lblMeses.setBounds(223, 87, 52, 15);
		panel.add(lblMeses);
		
		JLabel lblMesLact = new JLabel("días lact.");
		lblMesLact.setBounds(12, 118, 82, 15);
		panel.add(lblMesLact);
		
		mesesLactanciaTextField = new JTextField();
		mesesLactanciaTextField.setEditable(false);
		mesesLactanciaTextField.setColumns(10);
		mesesLactanciaTextField.setBounds(100, 116, 114, 19);
		panel.add(mesesLactanciaTextField);
		
		final JProgressBar progressBar = new JProgressBar();
		progressBar.setBounds(12, 197, 114, 25);
		panel.add(progressBar);
		progressBar.setStringPainted(true);
		progressBar.setToolTipText("");
		
		JButton btnComenzar = new JButton("Comenzar");
		btnComenzar.setBounds(150, 197, 113, 25);
		panel.add(btnComenzar);
		
		JButton btnSigVaca = new JButton("Sig. vaca");
		btnSigVaca.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				MJX.instance.setSiguienteVaca();
			}
		});
		btnSigVaca.setBounds(150, 160, 113, 25);
		panel.add(btnSigVaca);
		
		JButton btnAntVaca = new JButton("Ant. vaca");
		btnAntVaca.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				MJX.instance.setAnteriorVaca();
			}
		});
		btnAntVaca.setBounds(12, 160, 113, 25);
		panel.add(btnAntVaca);
		btnComenzar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Vaca vaca = vacas.get(vacaActual);
				int vLactometro = lactometro.getValorSensado();
				double vPotenciometro = potenciometro.getValorSensado();
				Color vCMOS = sensorCMOS.getValorSensado();
				double vGrasometro = grasometro.getValorSensado();
				lactometroTextField.setText(Integer.toString(vLactometro));

				potenciometroTextField.setText(Double.toString(vPotenciometro));

				RedTextField.setText(Integer.toString(vCMOS.getRed()));
				GreenTextField.setText(Integer.toString(vCMOS.getGreen()));
				BlueTextField.setText(Integer.toString(vCMOS.getBlue()));
				
				GrasaTextField.setText(Double.toString(vGrasometro));
				int cantLeche = cantleche.getValorSensado();
				produccionTextField.setText(Integer.toString(cantLeche));
				
				
				
				progressBar.setValue(100);

				Diagnostico diagnostico = new Diagnostico(vLactometro, vPotenciometro,vGrasometro,vCMOS);
				
				estadoDensidadTextField.setText(diagnostico.evaluarDensidad());
				estadoDensidadTextField.setForeground(Color.GREEN);
				if(diagnostico.evaluarDensidad() == Diagnostico.RESULTADO_MUY_ALTO || diagnostico.evaluarDensidad() == Diagnostico.RESULTADO_MUY_BAJO)
					estadoDensidadTextField.setForeground(Color.RED);
				
				estadoPhTextField.setText(diagnostico.evaluarPh());
				estadoPhTextField.setForeground(Color.GREEN);
				if(diagnostico.evaluarPh() == Diagnostico.RESULTADO_MUY_ALTO || diagnostico.evaluarPh() == Diagnostico.RESULTADO_MUY_BAJO)
					estadoPhTextField.setForeground(Color.RED);
				
				estadoColorTextField.setText(diagnostico.evaluarColor());
				estadoColorTextField.setForeground(Color.GREEN);
				if(diagnostico.evaluarColor() == Diagnostico.RESULTADO_MUY_ALTO || diagnostico.evaluarColor() == Diagnostico.RESULTADO_MUY_BAJO)
					estadoColorTextField.setForeground(Color.RED);
				
				estadoGrasaTextField.setText(diagnostico.evaluarGrasa());
				estadoGrasaTextField.setForeground(Color.GREEN);
				if(diagnostico.evaluarGrasa() == Diagnostico.RESULTADO_MUY_ALTO || diagnostico.evaluarGrasa() == Diagnostico.RESULTADO_MUY_BAJO)
					estadoGrasaTextField.setForeground(Color.RED);
				
				estadoGeneralTextField.setText(diagnostico.getEstadoGeneral());
				estadoGeneralTextField.setForeground(Color.GREEN);
				if(diagnostico.getEstadoGeneral() == Diagnostico.ESTADO_ALARMANTE){
					estadoGeneralTextField.setForeground(Color.RED);
					Alarma frame = new Alarma();
					frame.setVisible(true);
				}
				else{
					vaca.lecheBEVaca += cantLeche;
				}
				
				observacionesCalidadTextField.setText(diagnostico.evaluacionGeneral());
				
				PlanDeAlimentacion plan = new PlanDeAlimentacion(vacas.get(vacaActual));
				MJX.instance.setPlanDeAlimentacion(plan);
				
				vaca.lecheVaca += cantLeche;
				vaca.grasasVaca = (int)vGrasometro;
				vaca.alimentoVaca += plan.getCantDeMezcla();
		        lecheTotalGeneral += cantLeche;
		        
		        double a = (100*vaca.lecheBEVaca)/vaca.lecheVaca;
		        double b = (100*vaca.lecheVaca)/lecheTotalGeneral;
		        lecheBuenEstadoPB.setValue((int)Math.round(a));
		        lecheTotalPBar.setValue((int)Math.round(b));
		        grasasPB.setValue(vaca.grasasVaca);
		        AlimentoTextField.setText(Integer.toString(vaca.alimentoVaca));
		        lecheTotalGeneralTextField.setText(Integer.toString(lecheTotalGeneral));
		        VacasTextField.setText(Integer.toString(vacas.size()));
		        
			}
		});
		
		JPanel panel_1 = new JPanel();
		panel_1.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		panel_1.setBounds(12, 128, 280, 164);
		frmSistemaDeControl.getContentPane().add(panel_1);
		
		JLabel label = new JLabel("");
		panel_1.add(label);
		label.setIcon(new ImageIcon(MJX.class.getResource("/resources/vaca.png")));
		
		
		this.setVaca(this.vacas.get(this.vacaActual));
	}
	
	
	private void setSiguienteVaca(){
		this.vacaActual = (this.vacaActual + 1)%vacas.size();
		Vaca vaca = vacas.get(this.vacaActual);
		this.setVaca(vaca);
	}
	
	private void setAnteriorVaca(){
		this.vacaActual = (this.vacaActual == 0)? 5 : this.vacaActual;
		this.vacaActual = (this.vacaActual - 1)%vacas.size();
		Vaca vaca = vacas.get(this.vacaActual);
		this.setVaca(vaca);
	}
	
	private void setVaca(Vaca vaca){
		idTextField.setText(vaca.getId());
		edadTextField.setText(Integer.toString(vaca.getEdad()));
		mesesLactanciaTextField.setText(Integer.toString(vaca.getDiasDeLactancia()));
		pesoTextField.setText(Integer.toString(vaca.getPesoVivoActual()));
	}
	
	
	public void setPlanDeAlimentacion(PlanDeAlimentacion plan){
		String resumen = "";
		resumen += " Cantidad de mezcla total: " + plan.getCantDeMezcla() + "\n\n\n";
		
		List<Concentrado> concentrados = plan.getMezcla();
		Iterator<Concentrado> iterator = concentrados.iterator();
		int i = 1;
		while(iterator.hasNext()){
			Concentrado concentrado = iterator.next();
			resumen += " -Cantidad de concentrado " + i + ": " + concentrado.getCantidad() + "\n";
			Iterator<String> itComponentes = concentrado.getComponentes().iterator();
			Iterator<String> itPorcentajes = concentrado.getPorcentajes().iterator();
			while (itComponentes.hasNext() && itPorcentajes.hasNext()){
				resumen += "   " + itComponentes.next() + " : " + itPorcentajes.next() + "%\n";
			}

			i++;
			resumen += "\n\n";
		}
		resumenTextPane.setText(resumen);
		
	}
}
